package com.zzz.offer.ischildtree;


public class IsChildTree3 {

    public boolean HasSubtree(TreeNode root1, TreeNode root2) {

        if (root1 == null || root2 == null) {
            return false;
        }


        // 直接 递归调用 左树节点  和  右树节点。。。牛逼
        return checkIsChildTree(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);


    }


    public boolean checkIsChildTree(TreeNode treeA, TreeNode treeB) {

        // 如果treeB节点为空 那直接返回true  treeB的孩子节点为空不需要进行比较
        if (treeB == null) {
            return true;
        }

        // 1.比较当前结点  如果返回false 直接返回 如果返回true，接着比较左孩子节点
        if (treeA == null || treeA.val != treeB.val) {
            return false;
        }

        // 2.比较左孩子   如果返回false 直接返回 如果返回true，接着比较右孩子节点
        if (!checkIsChildTree(treeA.left, treeB.left)) {
            return false;
        }

        // 3.比较右孩子   如果返回false 直接返回 如果返回 true 就相当于本节点包括子树都匹配成功， 返回true
        return checkIsChildTree(treeA.right, treeB.right);

    }
}
